function vslide(elements, originalDirection, originalSpeed, method, arguments) {
	var timeoutSpeed = 30;

	if (window.slideTimer) {
		window.clearTimeout(window.slideTimer);
		window.slideTimer = null;
	}

	if (!window.slideArray) {
		window.slideArray = new Array();
	}
	if (elements) {
		if (elements.join == undefined) {
			elements = [elements];
		}
		// declare any array optional variables here
		var directions = new Array();
		for (var i = 0; i < elements.length; i++) {
			elements[i] = (typeof(elements[i]) == 'string') ? document.getElementById(elements[i]) : elements[i];
			// normalize your argument properties here
			if (originalDirection === null || originalDirection === undefined) {
				directions[i] = null;
			}
			else if (originalDirection === true || originalDirection === false) {
				directions[i] = originalDirection;
			}
			else {
				if (originalDirection[i] === true || originalDirection[i] === false) {
					directions[i] = originalDirection[i];
				}
				else {
					directions[i] = null;
				}
			}
			var element = elements[i];
			var addItem = true;
			for (var x = 0; x < window.slideArray.length; x++) {
				if (window.slideArray[x].element == element) {
					// reset properties if element is already active here
					window.slideArray[x].direction = directions[i];
					if (directions[i] === null) {
						window.slideArray[x].speed *= -1;
					}
					else if (directions[i] === true) {
						window.slideArray[x].speed = Math.abs(window.slideArray[x].speed);
					}
					else if (directions[i] === false) {
						window.slideArray[x].speed = -1 * Math.abs(window.slideArray[x].speed);
					}
					addItem = false;
					break;
				}
			}
			if (addItem) {
				var getStyle = function(element, cssStyle) {
					if (element.currentStyle) {
						return element.currentStyle[cssStyle].toLowerCase();
					}
					else if (document.defaultView && document.defaultView.getComputedStyle) {
						return document.defaultView.getComputedStyle(element, null).getPropertyValue(cssStyle).toLowerCase();
					}
				}
				// get custom css properties here
				var hidden = getStyle(element, 'display');
				var originalHeight = getStyle(element, 'height');
				// normalize values before adding
				var height = originalHeight;

				if (originalHeight == 'auto') {
					element.style.display = 'block';
					height = element.offsetHeight;
					element.style.display = hidden;
				}
				else {
					var tmpHeight = element.style.height;
					element.style.height = 'auto';
					if (height == getStyle(element, 'height')) {
						originalHeight = 'auto';
					}
					element.style.height = tmpHeight;
				}
				if (originalSpeed == 0) {
					var speed = 0;
				}
				else {
					var speed = Math.round((((parseFloat(height) / originalSpeed) / 1000) * timeoutSpeed) * 10) / 10;
				}
				// find if item is hidden or shown
				if (hidden != 'none') {
					if (directions[i] === true) {
						addItem = false;
					}
					hidden = false;
					speed *= -1;
				}
				else {
					if (directions[i] === false) {
						addItem = false;
					}
					hidden = true;
				}
				// incase an error has occured, so something
				if (parseFloat(height) == 0) {
						element.style.display = 'none';
						addItem = false;
				}
				if (addItem) {
					// set default element properties here
					element.style.height = height;
					element.style.overflow = 'hidden';
					element.style.margin = '0px';
					element.style.padding = '0px';
					if (hidden) {
						element.style.height = '0px';
					}
					// create your class properties here
					var newClass = {
						element : element,//required
						method : method,//required
						arguments: arguments,//required
						speed : parseFloat(speed),
						autoHeight : (originalHeight == 'auto'),
						height : parseFloat(height),
						direction : directions[i]
					};
					window.slideArray.push(newClass);
				}
			}
		}
	}
	
	for (var i = 0; i < window.slideArray.length; i++) {
		var obj = window.slideArray[i];
		
		// put code to run every iteration here
		var height = parseFloat(obj.element.style.height);

		// put code to trigger the last iteration here
		if (height + obj.speed >= obj.height || height + obj.speed <= 0 || obj.speed == 0) {
			if (obj.speed == 0) {
				if (height == 0) {
					obj.element.style.display = 'block';
				}
				else {
					obj.element.style.display = 'none';
				}
			}
			else {
				if (height + obj.speed < obj.height) {
					obj.element.style.display = 'none';
				}
			}
			if (obj.autoHeight) {
				obj.element.style.height = null;
			}
			else {
				obj.element.style.height = obj.height + 'px';
			}
				
			if (obj.method) {
				obj.method(obj.element, obj.element.style.display != 'none', arguments);
			}

			//cleanup
			delete window.slideArray[i];
			window.slideArray[i] = null;
			window.slideArray.splice(i, 1);
		}
		else {
			// put code to run every iteration besides last one here
			obj.element.style.height = (height + obj.speed) + 'px';
			obj.element.style.display = 'block';
		}
	}

	//reiterate
	if (window.slideArray.length > 0) {
		window.slideTimer = window.setTimeout('vslide();', timeoutSpeed);
	}
}

